package in.rob.client.page;
import in.lib.Constants;
import in.lib.URLMatcher;
import in.lib.annotation.InjectView;
import in.lib.annotation.OnClick;
import in.lib.manager.APIManager;
import in.lib.manager.CacheManager;
import in.lib.manager.SettingsManager;
import in.lib.manager.UpdateManager;
import in.lib.manager.UserManager;
import in.lib.utils.Views;
import in.rob.client.Licences;
import in.rob.client.MainApplication;
import in.rob.client.MainApplication.ApplicationType;
import in.rob.client.R;
import in.rob.client.base.RobinFragment;
import in.rob.client.dialog.base.DialogBuilder;
import java.io.File;
import java.text.DecimalFormat;
import java.util.List;
import net.callumtaylor.asynchttp.response.JsonResponseHandler;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;
import com.google.gson.JsonElement;
import com.nostra13.universalimageloader.core.ImageLoader;
public class AdditionalSettingsPage extends RobinFragment implements OnClickListener, OnCheckedChangeListener, OnSeekBarChangeListener
{
@OnClick @InjectView(R.id.change_log) public View mChangeLog;
@OnClick @InjectView(R.id.developer_info) public View mDeveloperInfo;
@OnClick @InjectView(R.id.image_cache) public View mImageCache;
@OnClick @InjectView(R.id.cache) public View mCache;
@OnClick @InjectView(R.id.licenses) public View mLicences;
@OnClick @InjectView(R.id.check_updates) public View mCheckUpdates;
@InjectView(R.id.image_cache_size) public TextView mImageCacheSize;
@InjectView(R.id.cache_size) public TextView mCacheSize;
@InjectView(R.id.version_name) public TextView mVersionName;
@InjectView(R.id.device_id) public TextView mDeviceId;
@InjectView(R.id.build_number) public TextView mBuildNumber;
@InjectView(R.id.analytics) public CheckBox mAnalytics;
@InjectView(R.id.crash_reports) public CheckBox mCrashReporting;
@InjectView(R.id.max_cache) public SeekBar mMaxCache;
@InjectView(R.id.max_image_cache) public SeekBar mMaxImageCache;
@InjectView(R.id.max_cache_size) public TextView mMaxCacheSize;
@InjectView(R.id.max_image_size) public TextView mMaxImageCacheSize;
private SettingsManager mSettings;
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.additional_settings_view, null);
Views.inject(this, view);
return view;
}
@Override public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
mSettings = SettingsManager.getInstance();
try
{
mBuildNumber.setText("" + getContext().getPackageManager().getPackageInfo(getContext().getPackageName(), 0).versionCode);
}
catch (Exception e) {}
mDeviceId.setText(getDeviceId());
mVersionName.setText(getString(R.string.version) + " " + getString(R.string.app_version));
mImageCacheSize.setText(getString(R.string.currently) + ": " + calculateImageCacheSize());
mCacheSize.setText(getString(R.string.currently) + ": " + calculateCacheSize());
mAnalytics.setOnCheckedChangeListener(this);
mAnalytics.setChecked(SettingsManager.isAnalyticsEnabled());
mCrashReporting.setOnCheckedChangeListener(this);
mCrashReporting.setChecked(SettingsManager.isCrashReportEnabled());
mMaxCacheSize.setText(SettingsManager.getMaxCacheSize() + "mb");
mMaxImageCacheSize.setText(SettingsManager.getMaxImageCacheSize() + "mb");
mMaxCache.setProgress(SettingsManager.getMaxCacheSize() - 10);
mMaxImageCache.setProgress(SettingsManager.getMaxImageCacheSize() - 10);
mMaxCache.setOnSeekBarChangeListener(this);
mMaxImageCache.setOnSeekBarChangeListener(this);
if (((MainApplication)getActivity().getApplication()).getApplicationType() == ApplicationType.CD_KEY)
{
((View)mCheckUpdates.getParent()).setVisibility(View.VISIBLE);
}
}
public String calculateImageCacheSize()
{
try
{
if (getContext().getExternalCacheDir() != null)
{
File f = new File(getContext().getExternalCacheDir().getAbsolutePath() + "/uil-images/");
File[] files = f.listFiles();
long size = 0;
for (File file : files)
{
size += file.length();
}
return Math.floor((size / 1024.0d / 1024.0d) * 100.0d) / 100.0d + "MB";
}
else
{
return "unavailable";
}
}
catch (Exception e)
{
return "unavailable";
}
}
public String calculateCacheSize()
{
try
{
if (getContext().getFilesDir() != null)
{
File f = new File(getContext().getFilesDir().getAbsolutePath());
File[] files = f.listFiles();
long size = 0;
for (File file : files)
{
size += file.length();
}
return Math.floor((size / 1024.0d / 1024.0d) * 100.0d) / 100.0d + "MB";
}
else
{
return "unavailable";
}
}
catch (Exception e)
{
return "unavailable";
}
}
@Override public void onDestroy()
{
((MainApplication)getApplicationContext()).initImageLoader();
CacheManager.getInstance().checkLimit();
super.onDestroy();
}
@Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
progress += 10;
if (seekBar == mMaxCache)
{
mMaxCacheSize.setText(progress + "mb");
mSettings.setMaxCacheSize(progress);
}
else if (seekBar == mMaxImageCache)
{
mMaxImageCacheSize.setText(progress + "mb");
mSettings.setMaxImageCacheSize(progress);
}
}
@Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if (buttonView == mAnalytics)
{
mSettings.setAnalyticsEnabled(isChecked);
}
else if (buttonView == mCrashReporting)
{
mSettings.setCrashReportingEnabled(isChecked);
}
}
@Override public void onClick(View v)
{
if (v == mCache)
{
DialogBuilder.create(getContext())
.setTitle(R.string.confirm)
.setMessage(R.string.clear_cache)
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{
File f = new File(getContext().getFilesDir().getAbsolutePath());
File[] files = f.listFiles();
List<String> userIds = UserManager.getLinkedUserIds(getContext());
for (int index = 0; index < userIds.size(); index++)
{
userIds.set(index, "cache_" + String.format(Constants.CACHE_USER, userIds.get(index)));
}
for (File file : files)
{
if (!file.getName().equals("cache_" + Constants.CACHE_AUTH) &&
!file.getName().equals("cache_" + Constants.CACHE_LINKED_ACCOUNTS) &&
!userIds.contains(file.getName())
)
{
file.delete();
}
}
mCacheSize.setText("Currently: 0.0MB");
Toast.makeText(getContext(), R.string.cache_cleared, Toast.LENGTH_LONG).show();
}
})
.setNegativeButton(R.string.cancel, null)
.show();
}
else if (v == mCheckUpdates)
{
Toast.makeText(getContext(), R.string.checking_for_updates, Toast.LENGTH_LONG).show();
APIManager.getInstance().checkUpdates(getContext(), new JsonResponseHandler()
{
@Override public void onSuccess(){}
@Override public void onFinish(boolean failed)
{
if (!failed)
{
JsonElement response = getContent();
if (response != null)
{
try
{
final String url = response.getAsJsonObject().get("update_url").getAsString();
String version = response.getAsJsonObject().get("version").getAsString();
int build = response.getAsJsonObject().get("build").getAsInt();
int currentBuild = getContext().getPackageManager().getPackageInfo(getContext().getPackageName(), 0).versionCode;
if (build > currentBuild)
{
DialogBuilder.create(getContext())
.setTitle(R.string.new_update_title)
.setMessage(getString(R.string.update_message_long, version))
.setPositiveButton(R.string.update, new DialogInterface.OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{
Intent updateIntent = new Intent(getContext(), UpdateManager.class);
updateIntent.putExtra(Constants.EXTRA_WEB_URL, url);
startActivity(updateIntent);
}
})
.setNegativeButton(R.string.cancel, null)
.show();
}
else
{
Toast.makeText(getContext(), R.string.no_updates, Toast.LENGTH_LONG).show();
}
}
catch (Exception e){}
}
}
}
});
}
else if (v == mLicences)
{
Intent licences = new Intent(getActivity(), Licences.class);
startActivity(licences);
}
else if (v == mImageCache)
{
DialogBuilder.create(getContext())
.setTitle(R.string.confirm)
.setMessage(R.string.clear_images)
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{
ImageLoader.getInstance().clearDiscCache();
ImageLoader.getInstance().clearMemoryCache();
mImageCacheSize.setText("Currently: 0.0MB");
Toast.makeText(getContext(), R.string.image_cache_cleared, Toast.LENGTH_LONG).show();
}
})
.setNegativeButton(R.string.cancel, null)
.show();
}
else if (v == mChangeLog)
{
Intent changeLog = new Intent(getContext(), URLMatcher.class);
changeLog.setData(Uri.parse("http://blog.robinapp.net/version010breleasenotes"));
startActivity(changeLog);
}
else if (v == mDeveloperInfo)
{
String email = "";
email += "Device id: " + getDeviceId();
email += "<br />";
email += "App version: " + getString(R.string.app_version);
try
{
email += "<br />";
email += "Build number: " + getContext().getPackageManager().getPackageInfo(getContext().getPackageName(), 0).versionCode;
}
catch (Exception e) {}
email += "<br /><br />";
email += "Name: " + UserManager.getUser().getUserName();
email += "<br /><br />";
email += "Username: " + UserManager.getUser().getMentionName();
email += "<br />";
email += "User id: " + UserManager.getUser().getId();
email += "<br /><br />";
email += "Device: " + android.os.Build.MANUFACTURER + " " + android.os.Build.MODEL;
email += "<br />";
email += "OS Version: " + android.os.Build.VERSION.RELEASE;
Double allocated = new Double(android.os.Debug.getNativeHeapAllocatedSize()) / new Double((1048576));
Double available = new Double(android.os.Debug.getNativeHeapSize() / 1048576.0);
Double free = new Double(android.os.Debug.getNativeHeapFreeSize() / 1048576.0);
DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(2);
df.setMinimumFractionDigits(2);
email += "<br />";
email += "Memory Heap Native: Allocated " + df.format(allocated) + "MB of " + df.format(available) + "MB (" + df.format(free) + "MB free) in [" + getClass().getName() + "]";
email += "<br />";
email += "Memory Heap App: Allocated: " + df.format(new Double(Runtime.getRuntime().totalMemory() / 1048576)) + "MB of " + df.format(new Double(Runtime.getRuntime().maxMemory() / 1048576)) + "MB (" + df.format(new Double(Runtime.getRuntime().freeMemory() / 1048576)) + "MB free)";
email += "<br /><br />";
email += SettingsManager.dump().replace("\r\n", "<br />").replace("\t", " ");
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/html");
intent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(email));
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"help@robinapp.net"});
intent.putExtra(Intent.EXTRA_SUBJECT, "Robin: Developer information");
startActivity(Intent.createChooser(intent, "Send via"));
}
}
@Override public void onStartTrackingTouch(SeekBar seekBar){}
@Override public void onStopTrackingTouch(SeekBar seekBar){}
}